package com.tecsup.log.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import excepcion.DAOExcepcion;

import com.tecsup.log.modelo.ProductoMaterial;
import util.ConexionBD;



public class ProductoMaterialDAO extends BaseDAO {
	
	
	public Collection<ProductoMaterial> buscarPorId(int id) throws DAOExcepcion {
		System.out.println("ProductoDAO: buscarPorId(int id)");
		String query = "SELECT PRODUCTO_idProducto1, MATERIALES_idMaterial, unidades_por_producto" +
				" FROM producto_has_materiales WHERE PRODUCTO_idProducto1=?";
		Collection<ProductoMaterial> lista = new ArrayList<ProductoMaterial>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,id);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ProductoMaterial vo = new ProductoMaterial();
				vo.setIdProducto(rs.getInt("PRODUCTO_idProducto1"));
				vo.setIdMaterial(rs.getInt("MATERIALES_idMaterial"));
				vo.setUnidades(rs.getDouble("unidades_por_producto"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	
	public void insertar(ProductoMaterial vo) throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: insertar(Producto vo)");
		String query = "INSERT INTO producto_has_materiales(PRODUCTO_idProducto1, MATERIALES_idMaterial, unidades_por_producto) " +
				"VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setInt(1, vo.getIdProducto());
			stmt.setInt(2, vo.getIdMaterial());
			stmt.setDouble(3, vo.getUnidades());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int idProducto, int idMaterial) throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: eliminar(int idProducto, int idMaterial)");
		String query = "DELETE FROM producto_has_materiales where PRODUCTO_idProducto1=? and MATERIALES_idMaterial=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idProducto);
			stmt.setInt(2, idMaterial);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar1(int idProducto) throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: eliminar(int idProducto, int idMaterial)");
		String query = "DELETE FROM producto_has_materiales where PRODUCTO_idProducto1=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idProducto);

			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<ProductoMaterial> listar() throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: listar()");
		Collection<ProductoMaterial> c = new ArrayList<ProductoMaterial>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT PRODUCTO_idProducto1, MATERIALES_idMaterial, unidades_por_producto" +
					" from producto_has_materiales";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ProductoMaterial vo = new ProductoMaterial();
				vo.setIdProducto(rs.getInt("PRODUCTO_idProducto1"));
				vo.setIdMaterial(rs.getInt("MATERIALES_idMaterial"));
				vo.setUnidades(rs.getInt("unidades_por_producto"));
								
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public ProductoMaterial obtener(int idProducto, int idMaterial) throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: obtener(int idProducto)");
		ProductoMaterial vo = new ProductoMaterial();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select PRODUCTO_idProducto1, MATERIALES_idMaterial, unidades_por_producto" +
					"  from producto_has_materiales where PRODUCTO_idProducto1=? and MATERIALES_idMaterial=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idProducto);
			stmt.setInt(2, idMaterial);
			rs = stmt.executeQuery();
			if (rs.next()) {

				vo.setIdProducto(rs.getInt(1));
				vo.setIdMaterial(rs.getInt(2));
				vo.setUnidades(rs.getDouble(3));
				

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public void actualizar(ProductoMaterial vo) throws DAOExcepcion {
		System.out.println("ProductoMaterialDAO: actualizar(Producto vo)");
		String query = "update producto_has_materiales set unidades_por_producto=? where PRODUCTO_idProducto1=? and MATERIALES_idMaterial=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDouble(1, vo.getUnidades());
			stmt.setInt(2, vo.getIdProducto());
			stmt.setInt(3, vo.getIdMaterial());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

}
